﻿using System;
using System.Windows.Controls.Primitives;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data;
using produccion.clases;
using System.ComponentModel;
using System.IO;
using System.Diagnostics;
using produccion.vistamodelo;
using produccion.reportes;

using System.Security.Principal;//FJRF - Agregada para comprobar la seguridad

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FrmConsultarOrdenesDeCompra.xaml
    /// </summary>
    public partial class FrmConsultarOrdenesDeCompra : Window
    {
        MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Traemos toda la informacion y funciones de MdoGeneral

        DataTable DtConsulta;//FJRF - Usamos este DataTable para hacer consultas generales
        String StrConsulta;//FJRF - Usamos este DataTable para hacer consultas generales

        string StrMensajeBox = "";//FJRF - Para los mensajes de las cajas de texto
        string StrCaptionBox = "";//FJRF - Para los mensajes de los caption de las cajas de texto

        public FrmConsultarOrdenesDeCompra()
        {
            InitializeComponent();
        }
        private void btnSalir_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            string strTituloVentana = "CONSULTAR ORDENES DE COMPRA" + " - Usuario:" + MDOgeneral.usuario + " - [FrmConsultarOrdenesDeCompra]";
            Title = strTituloVentana;//FJRF - Asignamos el nuevo nombre de la ventana agregando el usuario
        }
        private void TxtCodigoMaterial_TextChanged(object sender, TextChangedEventArgs e)
        {
            PrivV_BuscarDatos();//FJRF - Buscamos los datos recibidos
        }
        private void TxtCodigoColor_TextChanged(object sender, TextChangedEventArgs e)
        {
            PrivV_BuscarDatos();//FJRF - Buscamos los datos recibidos
        }
        private void TxtCodigoProveedor_TextChanged(object sender, TextChangedEventArgs e)
        {
            PrivV_BuscarDatos();//FJRF - Buscamos los datos recibidos
        }
        private void TxtNumeroDePedido_TextChanged(object sender, TextChangedEventArgs e)
        {
            PrivV_BuscarDatos();//FJRF - Buscamos los datos recibidos
        }
        private void PrivV_BuscarDatos()//FJRF - Buscamos los datos recibidos para generar consulta
        {
            #region FJRF - BuscamosElMaterial
            if (TxtCodigoMaterial.Text == null)//FJRF - Si el dato llega nulo hacemos lo siguiente
            {
                TxtCodigoMaterial.Text = "";//FJRF - Limpiamos el codigo
                LblNombreMaterial.Content = "";//FJRF - Limpiamos el nombre
            }
            else//FJRF - Si no llega nulo hacemos lo siguiente
            {
                if (TxtCodigoMaterial.Text.Trim() == "")//FJRF - Verificamos que tenga datos y si no lo tiene hacemos lo siguiente
                {
                    TxtCodigoMaterial.Text = "";//FJRF - Limpiamos el codigo
                    LblNombreMaterial.Content = "";//FJRF - Limpiamos el nombre
                }
                else//FJRF - Pero si trae datos hacemos lo siguiente
                {
                    LblNombreMaterial.Content = MdoGeneral.StrRetornarUnSoloCampo("NOMMAT_MAT", "NombreMaterial", "MAEMAT", "codmat_mat = '" + TxtCodigoMaterial.Text + "'");//FJRF - Buscamos el dato y lo asignamos donde corresponde
                }
            }
            #endregion

            #region FJRF - BuscamosElColor
            if (TxtCodigoColor.Text == null)//FJRF - Si el dato llega nulo hacemos lo siguiente
            {
                TxtCodigoColor.Text = "";//FJRF - Limpiamos el codigo
                LblNombreColor.Content = "";//FJRF - Limpiamos el nombre
            }
            else//FJRF - Si no llega nulo hacemos lo siguiente
            {
                if (TxtCodigoColor.Text.Trim() == "")//FJRF - Verificamos que tenga datos y si no lo tiene hacemos lo siguiente
                {
                    TxtCodigoColor.Text = "";//FJRF - Limpiamos el codigo
                    LblNombreColor.Content = "";//FJRF - Limpiamos el nombre
                }
                else//FJRF - Pero si trae datos hacemos lo siguiente
                {
                    LblNombreColor.Content = MdoGeneral.StrRetornarUnSoloCampo("NOMCOL_COL", "NombreColor", "maecolp", "codcol_col = '" + TxtCodigoColor.Text + "'");//FJRF - Buscamos el dato y lo asignamos donde corresponde
                }
            }
            #endregion

            #region FJRF - BuscamosElProveedor
            if (TxtCodigoProveedor.Text == null)//FJRF - Si el dato llega nulo hacemos lo siguiente
            {
                TxtCodigoProveedor.Text = "";//FJRF - Limpiamos el codigo
                LblNombreProveedor.Content = "";//FJRF - Limpiamos el nombre
            }
            else//FJRF - Si no llega nulo hacemos lo siguiente
            {
                if (TxtCodigoProveedor.Text.Trim() == "")//FJRF - Verificamos que tenga datos y si no lo tiene hacemos lo siguiente
                {
                    TxtCodigoProveedor.Text = "";//FJRF - Limpiamos el codigo
                    LblNombreProveedor.Content = "";//FJRF - Limpiamos el nombre
                }
                else//FJRF - Pero si trae datos hacemos lo siguiente
                {
                    LblNombreProveedor.Content = MdoGeneral.StrRetornarUnSoloCampo("NOMPRV_PRV", "NombreProveedor", "MAEPRVP", "CODPRV_PRV = '" + TxtCodigoProveedor.Text + "'");//FJRF - Buscamos el dato y lo asignamos donde corresponde
                }
            }
            #endregion

            #region FJRF - Validamos que tenga datos el numero de pedidos
            if (TxtNumeroDePedido.Text == null)
            {
                TxtNumeroDePedido.Text = "";
            }
            #endregion

            EjecutarSP_CONAUDENT(TxtCodigoMaterial.Text,TxtCodigoColor.Text,TxtCodigoProveedor.Text,TxtNumeroDePedido.Text);//FJRF - Ejecutamos SP

            try//FJRF - Nos aseguramos que el proceso que se va a ejecutar no tenga error alguno
            {
                StrConsulta = "SELECT HOJNRO_TMP AS HOJA,  FECHA_TMP AS FECHA, CANPRO_TMP AS CANTIDAD FROM TMPCONAUDENT ";//FJRF - Armamos la consulta
                DtConsulta = new DataTable();//FJRF - Limpiamos la tabla por si tiene datos ya que esta se usa para otros procesos
                DtConsulta = MdoGeneral.consulta(StrConsulta);//FJRF - Cargamos la consulta con los datos encontrados

                if (DtConsulta.Rows.Count > 0)
                {
                    DtgDatos.ItemsSource = DtConsulta.DefaultView;
                }
                else
                {
                    DtgDatos.ItemsSource = null;
                }
            }
            catch (Exception ex)//FJRF - Si se presenta algun error hacemos lo siguiente
            {
                StrCaptionBox = "PROCESO CANCELADO";//FJRF - Le ponemos un titulo a la ventana del mensaje
                StrMensajeBox = ex.Message;//FJRF - Capturamos el mensaje a mostrar
                Msgbox(StrCaptionBox, StrMensajeBox, MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Mostramos la ventana con el mensaje
            }
        }
        private void EjecutarSP_CONAUDENT(string strCodigoMateria, string strCodigoColor, string strCodigoProveedor, string strNumeroPedido)//FJRF - Este procedimiento ejecuta un sp
        {
            try
            {
                MDOgeneral.spComando.CommandText = "SP_CONAUDENT";
                MDOgeneral.spComando.Connection = MDOgeneral.conexion;
                MDOgeneral.spComando.CommandType = CommandType.StoredProcedure;
                MDOgeneral.spComando.Parameters.Clear();

                //Input
                MDOgeneral.spComando.Parameters.Add("pva_codmat", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = String.IsNullOrEmpty(strCodigoMateria) ? "" : strCodigoMateria;
                MDOgeneral.spComando.Parameters.Add("pva_codcol", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = String.IsNullOrEmpty(strCodigoColor) ? "" : strCodigoColor;
                MDOgeneral.spComando.Parameters.Add("pva_codprv", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = String.IsNullOrEmpty(strCodigoProveedor) ? "" : strCodigoProveedor;
                MDOgeneral.spComando.Parameters.Add("pnu_nroped", Oracle.DataAccess.Client.OracleDbType.Varchar2, 40).Value = String.IsNullOrEmpty(strNumeroPedido) ? "" : strNumeroPedido;

                //Output salidas
                MDOgeneral.spComando.Parameters.Add("pva_result", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.Parameters.Add("pva_errusu", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.ExecuteNonQuery();
            }
            catch (Exception ex) { throw ex; }
        }
        protected void Msgbox(String StrCaption, String StrMensaje, MessageBoxButton MsbTipoBoton, MessageBoxImage MsbTipoImagenIcono)
        {
            MessageBoxButton buttons;
            buttons = MsbTipoBoton;

            MessageBoxImage icon = MsbTipoImagenIcono;
            MessageBox.Show(StrMensaje, StrCaption, buttons, icon);
        }

        private void DtgDatos_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            string strNombreColumna = "";//FJRF - Variable para saber el nombre de la columna
            strNombreColumna = e.Column.Header.ToString();//FJRF - Extraemos el nombre de la columna

            e.Column.IsReadOnly = true;//FJRF - Inavilita las columnas para que no se pueda escribir sobre ella

            if (strNombreColumna == "CANTIDAD")//FJRF - Preguntamos si la variable trae este dato
            {
                (e.Column as DataGridTextColumn).Binding.StringFormat = "{0:##,#0.##}";
                (e.Column as DataGridTextColumn).CellStyle = newCellStyleAlinearDerecha();
            }
        }

        #region ParaObtenerLasPropiedadesDeLaCeldaDelGrid
        //DataGridCell cell = DataGridHelper.GetCell(dgEst, dgEst.SelectedIndex, 0);//FJRF - Asi se llama
        static class DataGridHelper
        {
            static public DataGridCell GetCell(DataGrid dg, int row, int column)
            {
                DataGridRow rowContainer = GetRow(dg, row);

                if (rowContainer != null)
                {
                    DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);

                    // try to get the cell but it may possibly be virtualized
                    DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                    if (cell == null)
                    {
                        // now try to bring into view and retreive the cell
                        dg.ScrollIntoView(rowContainer, dg.Columns[column]);
                        cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
                    }
                    return cell;
                }
                return null;
            }

            static public DataGridRow GetRow(DataGrid dg, int index)
            {
                DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
                if (row == null)
                {
                    // may be virtualized, bring into view and try again
                    dg.ScrollIntoView(dg.Items[index]);
                    row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index);
                }
                return row;
            }

            static T GetVisualChild<T>(Visual parent) where T : Visual
            {
                T child = default(T);
                int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
                for (int i = 0; i < numVisuals; i++)
                {
                    Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
                    child = v as T;
                    if (child == null)
                    {
                        child = GetVisualChild<T>(v);
                    }
                    if (child != null)
                    {
                        break;
                    }
                }
                return child;
            }
        }
        #endregion

        #region ParaAlinearALaDerecha
        public static Style newCellStyleAlinearDerecha()
        {
            System.Windows.Style style = new Style(typeof(DataGridCell));
            style.Setters.Add(new System.Windows.Setter
            {
                Property = Control.HorizontalAlignmentProperty,
                Value = HorizontalAlignment.Right
            });
            return style;
        }
        #endregion

    }
}
